/**
 * @file    CASMAgent.h
 * @brief   DC SM国密加解密功能
 * 
 * @details 提供加密初始化，获取加密模块状态及加密信息，提供字符串、文件、字节流加解密功能
 * 
 * @author  syf
 * @date    06/24/2025
 * @version V1.0
 * @copyright CA
 * 
 * @note 
 */

#ifndef SM_KEY_AGENT_H
#define SM_KEY_AGENT_H

#include <string>
#include <vector>
#include <stdio.h>
using namespace std;

// 长安SM加密信息
typedef struct CASMKeyMsg
{
    // 加密类型(SM加密类型: "SM4")
    string strEncryptType = "SM4";  // 默认SM4类型

    // 共享密钥id
    string strSharedKeyId = "";
} CASMKeyMsg;

class CASMAgent{
    public:
        static CASMAgent &getInstance();
        ~CASMAgent();

    private:
        CASMAgent();

    public:
        /**
         * @brief   初始化加密模块
         * @param   workDir 工作目录，用于缓存
         * @return  加密初始化结果
         */
        bool initSMKey(const string &workDir);

        /**
         * @brief   获取当前SM加密链路状态
         * @param   
         * @return  加密链路状态
         */
        bool getSMkeySts();

        /**
         * @brief   设置证书/密钥目录
         * @param   strDirectoryPath 加密存储目录
         * @return  设置目录是否成功
         */
        bool setCertKeySaveDirectory(const string& strDirectoryPath);

        /**
         * @brief   获取当前加密参数信息(业务层用于传输填充)
         * @param   
         * @return  加密参数(strEncryptType 加密类型 strSharedKeyId : 共享密钥id)
         */
        CASMKeyMsg getSharedKeyMsg();

        /**
         * @brief   字符串数据加密
         * @param   plaintext 待加密字符串
         * @param   encrptText 加密存储字符串
         * @param   outDataBase64 输出是否进行base64编码(默认base64编码)
         * @return  加密结果
         */
        bool encryptString(const string& plaintext, string& encrptText, bool outDataBase64 = true);

        /**
         * @brief   字符串数据解密
         * @param   ciphertext 加密字符串
         * @param   decrptText 解密存储字符串
         * @param   inDataBase64 输入字符串是否base64编码(默认base64编码)
         * @return  解密结果
         */
        bool decryptString(const string& ciphertext, string& decrptText, bool inDataBase64 = true);

        /**
         * @brief   文件数据加密
         * @param   inPath 待加密文件
         * @param   outPath 加密存储文件
         * @return  加密结果
         */
        bool encryptFile(const std::string& inPath, const std::string& outPath);

        /**
         * @brief   文件数据解密
         * @param   inPath 加密文件
         * @param   outPath 解密存储文件
         * @return  解密结果
         */
        bool decryptFile(const std::string& inPath, const std::string& outPath);

        /**
         * @brief   字节流加密
         * @param   plaintext 待加密字节流
         * @param   plaintext_len 待加密字节流长度
         * @return  加密后的数据
         */
        std::vector<uint8_t> encryptBuffer(const uint8_t* plaintext, size_t plaintext_len);

        /**
         * @brief   字节流解密
         * @param   plaintext 加密字节流
         * @param   plaintext_len 加密字节流长度
         * @return  解密后的数据
         */
        std::vector<uint8_t> decryptBuffer(const uint8_t* ciphertext, size_t ciphertext_len);
};

#endif